

#include	"main.h"





/* SCL_freq = Input_freq / (2^PRESCALER * (CLKLO + CLKHI + 2))*/
/* SCL_freq=40MHz/(2^3 * (12+6+2))=250KHz*/
BSW_LPI2C_Cfg   LPI2C0_Cfg =
{
    .Lpi2c_Base             =	LPI2C0,
    .ClockName              =	LPI2C0_CLK,
    .u32_ClkSoc       		=	6,

    .b_MDebug           	=	false,
    .b_MSet             	=	false,
    .b_MSofRest            	=	false,

    .Lpi2c_SlvCon         	=	LPI2C_SLAVE_ADDR_MATCH_0_7BIT,

    .Set_Mpres              =	LPI2C_MASTER_PRESC_DIV_8,
    .Set_MPinCfg            =	LPI2C_CFG_2PIN_OPEN_DRAIN,
    .Set_MNACKCfg           =	LPI2C_NACK_IGNORE,			/*LPI2C_NACK_IGNORE,  LPI2C_NACK_RECEIVE*/

    .b_MRxDMA               =	true,
    .b_MTxDMA               =	true,

    .b_MCirFIFO             =	false,
    .Set_MRxDataMatch       =	LPI2C_RX_DATA_KEEP_ALL,
    .Set_MTimeoutCfg        =	LPI2C_TIMEOUT_SCL,
    .b_MAutoStopCfg         =	true,

    .u8_MSDAG               =	0,
    .u8_MSCLG               =	0,
    .u16_MBusIdle           = 	50,
    .u32_MPinLow            = 	50,

    .u8_MDataValid          =	3,							/*配置数据位在CLK第9个下降沿的采集时间*/
    .u8_MSetupHold          =	6,							/*配置起始位 SDA下降沿和CLK下降沿 的延时*/
    .u8_MClockHigh          =	12,
    .u8_MClockLow           =	6,

    .u16_MRxFIFO            =	0,
    .u16_MTxFIFO            =	1,

};



BSW_Dma_Cfg I2C0_TxDma =
{
    .DMA_Ch 					=	DMA_CH6,								/*配置DMA通道    				eg: DMA_CH6					*/
    .IRQn						=	DMA6_IRQn,
    /*.SrcAddr					=	(u32)TCD0_Source,*/						/*配置源地址				eg: (u32)Dma_Src			*/
    .SrcOffset					=	2,										/*自动累加源地址大小			eg: 1 每次传输地址自动加1			*/
    .SrcTrfSize 				=	EDMA_TRANSFER_SIZE_2B,					/*源地址单次传输几个字节		eg:	EDMA_TRANSFER_SIZE_1B 	*/
    .SrcLastAdj       			= 	0,										/*配置传输完成时是否更改源地址	eg: 0 不更改源地址				*/

    /*.DestAddr					=	(u32)TCD0_Dest,	*/						/*配置目标地址				eg: (u32)Dma_Dest			*/
    .DestOffset					=	0,										/*自动累加目标地址大小			eg: 1 每次传输地址自动加1			*/
    .DestTrfSize				=	EDMA_TRANSFER_SIZE_2B,					/*目标地址单次传输几个字节		eg:	EDMA_TRANSFER_SIZE_1B 	*/
    .DestLastAdj      			= 	0,										/*配置传输完成时是否更改目标地址	eg: 0 不更改目标地址				*/

    .SetNbytes					=	2,										/*DMA开启每次传输几个字节		eg: 1  每次传输1个字节			*/
    .SetMjrCount				=	1,										/*DMA开启每次循环的次数 		eg: 10 每次传输多少次				*/
    .b_MjrCpltIrq				= 	true,									/*配置是否传输完成中断		*/
    .b_HlfCpltIrq				= 	false,
    .b_DmaRqstDone				=	true,									/*传输结束是否自动关闭DMA		eg: true 自动关闭DMA 			*/
    .b_Dma_En					=	false,									/*DMA使能配置				eg: true 使能DMA触发传输		*/
};

BSW_Dma_Cfg I2C0_RxDma =
{
    .DMA_Ch 					=	DMA_CH7,								/*配置DMA通道    				eg: DMA_CH0						*/
    .IRQn						=	DMA7_IRQn,
    /*.SrcAddr					=	(u32)TCD0_Source,*/						/*配置源地址				eg: (u32)Dma_Src				*/
    .SrcOffset					=	0,										/*自动累加源地址大小			eg: 1 每次传输地址自动加1				*/
    .SrcTrfSize 				=	EDMA_TRANSFER_SIZE_2B,					/*源地址单次传输几个字节		eg:	EDMA_TRANSFER_SIZE_1B 		*/
    .SrcLastAdj       			= 	0,										/*配置传输完成时是否更改源地址	eg: 0 不更改源地址					*/

    /*.DestAddr					=	(u32)TCD0_Dest,*/						/*配置目标地址				eg: (u32)Dma_Dest				*/
    .DestOffset					=	2,										/*自动累加目标地址大小			eg: 1 每次传输地址自动加1				*/
    .DestTrfSize				=	EDMA_TRANSFER_SIZE_2B,					/*目标地址单次传输几个字节		eg:	EDMA_TRANSFER_SIZE_1B 		*/
    .DestLastAdj      			= 	0,										/*配置传输完成时是否更改目标地址	eg: 0 不更改目标地址					*/

    .SetNbytes					=	2,										/*DMA开启每次传输几个字节		eg: 1  每次传输1个字节				*/
    .SetMjrCount				=	1,										/*DMA开启每次循环的次数 		eg: 10 每次传输多少次					*/
    .b_MjrCpltIrq				= 	true,									/*配置是否传输完成中断		*/
    .b_HlfCpltIrq				= 	false,
    .b_DmaRqstDone				=	true,									/*传输结束是否自动关闭DMA		eg: true 自动关闭DMA 				*/
    .b_Dma_En					=	false,									/* DMA使能配置				eg: true 使能DMA触发传输			*/
};



u32 ECU_IIC_Tx_Add = 0;
u32 ECU_IIC_Rx_Add = 0;
u32 DMA_TX_Lenth = 0;
u32 DMA_RX_Lenth = 0;
u32 IIC_DMA_Flg = false;
u8 G_u8_R_finishFlg = false;



/********************************************************
**函数名：	ECU_IIC_INIT
**功能：		IIC相关硬件模块初始化
**输入参数	无
**返回值：	无
**注意：		根据实际硬件电路确认通道
*********************************************************/
void ECU_IIC_INIT(void)
{
    BSW_GPIO_MUX_CONFIG(Bsw_Port_A,2,PORT_MUX_ALT3);                /*  I2C  SDA    */
    BSW_GPIO_MUX_CONFIG(Bsw_Port_A,3,PORT_MUX_ALT3);                /*  I2C  SCL    */
    //PINS_SetPullSel(PORTA,2,PORT_INTERNAL_PULL_UP_ENABLED);         /* 配置内置电阻 */
    //PINS_SetPullSel(PORTA,3,PORT_INTERNAL_PULL_UP_ENABLED);         /* 配置内置电阻 */
    BSW_LPI2C_INIT(LPI2C0_Cfg);
    /******************************************************
    LPI2C_Set_MasterHreqEnable(LPI2C0,true);
    LPI2C_Set_MasterInt(LPI2C0,LPI2C_MASTER_TRANSMIT_DATA_INT,true);
    NVIC_EnableIRQ(LPI2C0_Master_IR
    ******************************************************/
    /*******************DMA通道对应的设置**********************/
    BSW_DMAMUX_INIT(I2C0_TxDma.DMA_Ch,EDMA_REQ_LPI2C0_TX);
    I2C0_TxDma.SrcAddr = ECU_IIC_Tx_Add;
    I2C0_TxDma.DestAddr = (u32)&(LPI2C0->MTDR);
    BSW_DMA_INIT_CFG(I2C0_TxDma);

    BSW_DMAMUX_INIT(I2C0_RxDma.DMA_Ch,EDMA_REQ_LPI2C0_RX);
    I2C0_RxDma.SrcAddr = (u32)&(LPI2C0->MRDR);
    I2C0_RxDma.DestAddr = ECU_IIC_Rx_Add;
    BSW_DMA_INIT_CFG(I2C0_RxDma);
}


void ECU_IIC_REINIT(void)
{
    BSW_LPI2C_INIT(LPI2C0_Cfg);
    BSW_DMAMUX_INIT(I2C0_TxDma.DMA_Ch,EDMA_REQ_LPI2C0_TX);
    I2C0_TxDma.SrcAddr = ECU_IIC_Tx_Add;
    I2C0_TxDma.DestAddr = (u32)&(LPI2C0->MTDR);
    BSW_DMA_INIT_CFG(I2C0_TxDma);

    BSW_DMAMUX_INIT(I2C0_RxDma.DMA_Ch,EDMA_REQ_LPI2C0_RX);
    I2C0_RxDma.SrcAddr = (u32)&(LPI2C0->MRDR);
    I2C0_RxDma.DestAddr = ECU_IIC_Rx_Add;
    BSW_DMA_INIT_CFG(I2C0_RxDma);
}




void ECU_IIC_DMA_RDATA(u32 u32_TxAddr,u32 u32_RxAddr,u8 u8_Lenth)
{
    LPI2C_Clear_MasterNACKDetectEvent(LPI2C0);
    DMA_TX_Lenth = 0;
    BSW_DMA_REINIT(I2C0_TxDma.DMA_Ch,(u32)u32_TxAddr,(u32)(&(LPI2C0->MTDR)),u8_Lenth);
    //BSW_DMA_REINIT(I2C0_RxDma.DMA_Ch,(u32)(&(LPI2C0->MRDR)),u32_RxAddr,u8_Lenth - 4);   /*eeprom 抛弃接收的第一个数据*/
    BSW_DMA_REINIT(I2C0_RxDma.DMA_Ch,(u32)(&(LPI2C0->MRDR)),u32_RxAddr,u8_Lenth - 4);/*RTC RX9010 check*/
    BSW_DMA_START(I2C0_TxDma.DMA_Ch);
    BSW_DMA_START(I2C0_RxDma.DMA_Ch);
    IIC_DMA_Flg = true;
    G_u8_R_finishFlg = false;
}


void ECU_IIC_DMA_WDATA(u32 u32_TxAddr,u8 u8_Lenth)
{
    LPI2C_Clear_MasterNACKDetectEvent(LPI2C0);
    DMA_TX_Lenth = 0;
    ECU_IIC_Tx_Add = u32_TxAddr;
    BSW_DMA_REINIT(I2C0_TxDma.DMA_Ch,ECU_IIC_Tx_Add,(u32)(&(LPI2C0->MTDR)),u8_Lenth);
    BSW_DMA_START(I2C0_TxDma.DMA_Ch);
    IIC_DMA_Flg = true;
}





/******************************************************
	LPI2C_Reset_MasterTxFIFOCmd(LPI2C0);
	LPI2C_Reset_MasterRxFIFOCmd(LPI2C0);
	LPI2C_Clear_MasterEndPacketEvent(LPI2C0);
	LPI2C_Clear_MasterSTOPDetectEvent(LPI2C0);
	LPI2C_Clear_MasterPinLowTimeoutEvent(LPI2C0);
	LPI2C_Clear_MasterArbitrationLostEvent(LPI2C0);
	LPI2C_Clear_MasterNACKDetectEvent(LPI2C0);

********************************************************/

u32 dma6_irq=0;
u32 dma7_irq=0;

inline void ECU_IIC_DMA6_IRQ(void)
{
    dma6_irq++;

    /*调用外部函数置位传输完成标志*/
    if(IIC_DMA_Flg == true)
    {
        IIC_DMA_Flg = false;
        if(DMA_TX_Lenth != 0)
        {
            BSW_DMA_REINIT(I2C0_TxDma.DMA_Ch,ECU_IIC_Tx_Add,(u32)(&(LPI2C0->MTDR)),DMA_TX_Lenth);
            BSW_DMA_START(I2C0_TxDma.DMA_Ch);
        }
    }

}

inline void ECU_IIC_DMA7_IRQ(void)
{
    dma7_irq++;
	G_u8_R_finishFlg = true;
	/*调用外部函数置位传输完成标志*/
}


inline void ECU_IIC_TX_Dma(void)
{
	/*调用外部函数置位传输完成标志*/
	
}

inline void ECU_IIC_RX_Dma(void)
{
	/*调用外部函数置位传输完成标志*/
}


void LPI2C0_IRQ(void)
{
	if((LPI2C0->MSR) & 0x00000001)
	{
		
	}
	if((LPI2C0->MSR) & 0x00000002)
	{
		
		LPI2C0->MSR |= 0x00000002;
	}
}


